#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' main entry '
__author__ = 'pingwu you'

#空函数，必须pass占位
def nop():
    pass 
#函数执行完毕也没有return语句时，自动return None。
def ret_tuple():
    var1="hello"
    var2=999.02
    return var1,var2

#在Python中定义函数，可以5种参数都可以组合使用。
# 参数定义的顺序必须是：必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def complex(must,default="缺省",*args,name1,name2="命名关键字参数",**kw):    
    print("必选参数：%s " % must)
    print("默认参数：%s " % default)
    if(args != None and len(args)>0):
        #args中的参数会被位置参数吃掉
        print("可变参数："+str(args))
    print("命名关键字参数name1：%s " % name1)
    print("命名关键字参数name2：%s " % name2)
    #kw中的可映射到同名参数(所有参数)上，则被吃掉
    if(kw != None and len(kw)>0):
        print("关键字参数："+str(kw))


def mapreduce():
    #匿名函数有个限制，就是只能有一个表达式，不用写return，返回值就是该表达式的结果。
    nl=map(lambda x:x+x,filter(lambda x:x%2==0,[1,2,3,4]))
    #map/filter为中间操作，为惰性计算，需要最终操作的触发才能执行
    ls=list(nl)
    print(ls)
    #reduce是最终出结果操作！！
    from functools import reduce
    ls=reduce(lambda x,y:x+y,[1,2,3,4])
    print(ls)

def sort_help():
    ls=sorted(['bob', 'about', 'Zoo', 'Credit'])
    print(ls)
    #按key排序，但是key通过高阶函数进行转换后再进行比较判断顺序
    ls=sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower)
    print(ls)
    ls=sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower,reverse=True)
    print(ls)


#闭包中的变量可能被外界影响，所以最佳实践是引用不可变对象
clouse_global_arg="1111111111"
def closue_help(clouse_local_arg):
    def closure11():
        print("clouse_global_arg:%s   clouse_local_arg:%s"%(clouse_global_arg,clouse_local_arg)) 
    return closure11
    
